package com.pet.controller;

import com.pet.bean.Notification;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.net.ServerSocket;
import java.net.Socket;

//服务端：不断的执行，每接收要一个客户端就开启一个线程来进行处理
public class Server {
    public static void main(String[] args) throws IOException {
        //服务端：
        //	--创建套接字，指定端口
        ServerSocket serverSocket = new ServerSocket(8999);
        //	--监听和接收客户端的链接
        while (true){//不断执行监听和接收
            System.out.println("服务端正在监听链接------");
            Socket socket = serverSocket.accept();
            //创建一个线程进行处理
            new ServerThread(socket).start();
        }
    }
}
//定义一个线程：
class  ServerThread extends Thread{
    boolean isRun = true;//默认是运行
    Socket socket;//定义一个socket
    ObjectOutputStream oos;//定义流:对象流
    ObjectInputStream ois;

    //定义构造器
    public  ServerThread(Socket socket) {
        this.socket = socket;
    }
    //服务器线程要处理操作
    @Override
    public void run() {
        try {
            //初始化对象流
            oos = new ObjectOutputStream(socket.getOutputStream());
            ois = new ObjectInputStream(socket.getInputStream());
        } catch (IOException exception) {
            exception.printStackTrace();
        }
        //循环操作
        while (isRun){
            //--处理请求：知道客户端发送的什么请求？action【比如登录操作】《主人、商店、宠物、交易》
            try {
                //读取客户端发送过来Notification数据
                Notification notification = (Notification) ois.readObject();
                String service = notification.getService();
                String action = notification.getAction();

                Class<?> c = Class.forName("com.pet.service." + service);

                Method method;
                try {
                    method = c.getMethod(action, Notification.class);//获取method对象，action是方法名
                    notification = (Notification) method.invoke(c.getDeclaredConstructor().newInstance(),notification);//返回结果
                } catch (Exception e) {
                    e.printStackTrace();
                }
                oos.writeObject(notification);

            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                //出现IOException，则结束线程
                isRun = false;
                System.out.println("服务器进程结束---------------------");
            }
            //读取客户端发送过来Notification数据
                //解决一个通用性问题？反射：需要获取class对象，通过class来去创建对象和调用方法
                //操作处理完后，返回Notification数据
        }

        try {
            oos.close();
            ois.close();
            socket.close();
        } catch (IOException exception) {
            exception.printStackTrace();
        }
    }
}